package cn.tuling.extend;

/**
 * 扩展：使用“钩子方法”使得子类控制父类的行为。
 */
public class TemplateMethodTest {
    public static void main(String[] args) {
        HookAbstractClass hookAbstractClass = new HookClass();
        hookAbstractClass.templateMethod();
    }
}

abstract class HookAbstractClass {
    public void templateMethod() {
        specificMethod();
        if (hookMethod1())
            absMethod1();
        if (hookMethod2())
            absMethod2();
    }

    void specificMethod() {
        System.out.println("执行具体方法1");
    }

    abstract void absMethod1();

    abstract void absMethod2();

    boolean hookMethod1() {
        return true;
    }

    abstract boolean hookMethod2();
}

class HookClass extends HookAbstractClass {

    @Override
    void absMethod1() {
        System.out.println("执行抽象方法1");
    }

    @Override
    void absMethod2() {
        System.out.println("执行抽象方法2");
    }

    @Override
    boolean hookMethod2() {
        return false;
    }
}